package com.smart.community.feign.user.service;

import com.smart.community.feign.user.dto.UserDTO;
import com.smart.community.feign.user.dto.RoleDTO;
import com.smart.community.feign.user.fallback.UserFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import com.smart.community.feign.user.dto.NormalUserCreateDTO;

/**
 * 用户服务Feign接口
 * 提供用户管理相关的远程调用接口
 * 
 * @author Wu.Liang
 * @since 2025-01-21
 */
@FeignClient(name = "smart-community-user", 
             path = "/user/feign", 
             fallbackFactory = UserFeignFallbackFactory.class,
             contextId = "userFeignService")
public interface UserFeignService {

    /**
     * 根据用户ID获取用户信息
     * 
     * @param userId 用户ID
     * @return 用户信息
     */
    @GetMapping("/user/info/{userId}")
    UserDTO getUserById(@PathVariable("userId") Long userId);

    /**
     * 根据用户名获取用户信息
     * 
     * @param username 用户名
     * @return 用户信息
     */
    @GetMapping("/user/info/username/{username}")
    UserDTO getUserByUsername(@PathVariable("username") String username);

    /**
     * 根据身份证号获取用户信息
     * 
     * @param idCard 身份证号
     * @return 用户信息
     */
    @GetMapping("/user/info/idcard/{idCard}")
    UserDTO getUserByIdCard(@PathVariable("idCard") String idCard);

    /**
     * 根据手机号获取用户信息
     * 
     * @param phone 手机号
     * @return 用户信息
     */
    @GetMapping("/user/info/phone/{phone}")
    UserDTO getUserByPhone(@PathVariable("phone") String phone);

    /**
     * 创建用户
     * 
     * @param userDTO 用户信息
     * @return 创建的用户信息
     */
    @PostMapping("/user/create")
    UserDTO createUser(@RequestBody UserDTO userDTO);

    /**
     * 创建普通用户
     * 
     * @param userData 用户数据
     * @return 创建的用户ID
     */
    @PostMapping("/user/create/normal")
    Long createNormalUser(@RequestBody NormalUserCreateDTO dto);

    /**
     * 更新用户信息
     * 
     * @param userDTO 用户信息
     * @return 更新结果
     */
    @PostMapping("/user/update")
    Boolean updateUser(@RequestBody UserDTO userDTO);

    /**
     * 验证用户密码
     * 
     * @param userDTO 用户信息（包含密码）
     * @return 验证结果
     */
    @PostMapping("/user/validate")
    Boolean validatePassword(@RequestBody UserDTO userDTO);

    /**
     * 删除用户
     * 
     * @param userId 用户ID
     * @return 删除结果
     */
    @DeleteMapping("/user/delete/{userId}")
    Boolean deleteUser(@PathVariable("userId") Long userId);

    /**
     * 批量获取用户信息
     * 
     * @param userIds 用户ID列表
     * @return 用户信息列表
     */
    @PostMapping("/user/batch")
    List<UserDTO> getUsersByIds(@RequestBody List<Long> userIds);

    /**
     * 根据角色获取用户列表
     * 
     * @param roleCode 角色编码
     * @return 用户列表
     */
    @GetMapping("/user/list/role/{roleCode}")
    List<UserDTO> getUsersByRole(@PathVariable("roleCode") String roleCode);

    /**
     * 根据社区ID获取用户列表
     * 
     * @param communityId 社区ID
     * @return 用户列表
     */
    @GetMapping("/user/list/community/{communityId}")
    List<UserDTO> getUsersByCommunity(@PathVariable("communityId") Long communityId);

    /**
     * 根据物业公司ID获取用户列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 用户列表
     */
    @GetMapping("/user/list/property/{propertyCompanyId}")
    List<UserDTO> getUsersByPropertyCompany(@PathVariable("propertyCompanyId") Long propertyCompanyId);

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     */
    @GetMapping("/user/check-username/{username}")
    Boolean checkUsernameExists(@PathVariable("username") String username);

    /**
     * 检查手机号是否存在
     * 
     * @param phone 手机号
     * @return 是否存在
     */
    @GetMapping("/user/check-phone/{phone}")
    Boolean checkPhoneExists(@PathVariable("phone") String phone);

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱
     * @return 是否存在
     */
    @GetMapping("/user/check-email/{email}")
    Boolean checkEmailExists(@PathVariable("email") String email);

    /**
     * 分配用户角色
     * 
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 分配结果
     */
    @PostMapping("/user/role/assign/{userId}")
    Void assignUserRoles(@PathVariable("userId") Long userId, @RequestBody List<Long> roleIds);

    /**
     * 根据用户ID获取用户关联的角色信息列表
     * 
     * @param userId 用户ID
     * @return 角色信息列表
     */
    @GetMapping("/user/roles/{userId}")
    List<RoleDTO> getUserRoles(@PathVariable("userId") Long userId);

    /**
     * 更新用户类型
     * 
     * @param userId 用户ID
     * @param userType 用户类型
     * @return 更新结果
     */
    @PutMapping("/user/type/{userId}")
    Boolean updateUserType(@PathVariable("userId") Long userId, @RequestParam("userType") String userType);

    /**
     * 根据角色代码获取角色ID
     * 
     * @param roleCode 角色代码
     * @return 角色ID
     */
    @GetMapping("/role/id/{roleCode}")
    Long getRoleIdByCode(@PathVariable("roleCode") String roleCode);
} 